<?php

class CierreCajasController extends AppController {

    var $name = 'CierreCajas';
    var $uses = array('CierreCaja', 'FormasPago');
    var $helpers = array('Formulario', 'Interfaz', 'AjaxAG');
    var $components = array('Interfaz', 'Maestro', 'Correo');
    var $layout = "ajax";

    public function beforeFilter() {
        $this->validar_sesion();
    }
    
    public function afterFilter() {
        $this->auditoria();
    }

    public function index($fecha = null, $pto = null) {
        $validar = 0;
        $bien=0;
        if(empty($pto)) {
            $validar = 1;
        }
        if($validar == 0) {
            $bien=1;
        } else if ($this->validar_cierre()) {
            $bien=1;
        }
        
        if($bien == 1){
            $totalesCobranza = array();
            $fecha = (isset($fecha)) ? $fecha : date('d-m-Y');
            $pto = (isset($pto)) ? $pto : $this->Session->read('punto_id');
            $usuarioId = $this->Interfaz->id($this->Session->read('usuario_id'));
            $tiendaSesion = $this->Session->read('tiendaBD');
            $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
            $objPunto = $this->Maestro->modelo('punto', 'Punto', $tiendaSesion);
            $infoFacturacion = $objFac->find('first', array('fields' => array('MIN(Facturacion.numero) AS min_fac', 'MAX(Facturacion.numero) AS max_fac', 'MIN(Facturacion.numero_control) AS min_con', 'MAX(Facturacion.numero_control) AS max_con'), 'conditions' => array('Facturacion.punto_id' => $pto, 'CAST(Facturacion.fecha AS DATE) =' => $fecha)));
            $formasPago = $this->FormasPago->find('list', array('fields' => array('FormasPago.id', 'FormasPago.id'), 'conditions' => array('FormasPago.estatus' => 1, 'FormasPago.metforpag' => 'T')));
            $data = $objFac->query("((SELECT * FROM fnc_cierre_caja_punto('detallado', '$fecha', '$usuarioId', $pto) AS (formapago text, monto text, impuesto text, factura text, referencia text, banco text, porcentaje_ret text, monto_ret text, porcentaje_ret_islr text, monto_ret_islr text, tipo_pago text))
                                    UNION (SELECT 'EFECTIVO (NCR)', (n.monto*-1)::TEXT, 'O', '', n.numero::TEXT, '', 'O', 'O', 'O', 'O', '1' FROM nota_creditos n WHERE n.fecha = '$fecha' AND n.estatus = 3 AND punto_id = $pto)) ORDER BY 11, 1, 4");
            $dataCobranza = $objFac->query("select * FROM fnc_cierre_caja_cobranzas('detallado', '$fecha', '$usuarioId', $pto) AS (formapago text, monto text, impuesto text, factura text, referencia text, banco text, porcentaje_ret text, monto_ret text, porcentaje_ret_islr text, monto_ret_islr text, tipo_pago text)");
            $nombrePunto = $objPunto->find('first', array('fields' => 'Punto.nombre', 'conditions' => array('Punto.id' => $pto)));
            
            foreach ($dataCobranza as $indice => $valor) {
                if(!isset($totalesCobranza[$valor[0]['formapago']]))
                    $totalesCobranza[$valor[0]['formapago']] = 0;
                $totalesCobranza[$valor[0]['formapago']] += $valor[0]['monto'];
            }

            $this->set('fecha', $fecha);
            $this->set('punto_id', $pto);
            $this->set('nombrePunto', $nombrePunto['Punto']['nombre']);
            $this->set('infoFac', $infoFacturacion);
            $this->set('data', $data);
            $this->set('dataCobranza', $dataCobranza);
            $this->set('totalesCobranza', $totalesCobranza);
            $this->set('listaFormasPago', $formasPago);
        }
    }
    
    public function buscar() {
        extract($this->request->data);
        if(!empty($fechaCierreCaja)) {
            $tiendaSesion = $this->Session->read('tiendaBD');
            $objCierreCaja = $this->Maestro->modelo('punto', 'CierreCaja', $tiendaSesion);

            $data = $objCierreCaja->find('all', array('conditions' => array('CierreCaja.fecha' => $fechaCierreCaja)));

            if(!empty($data)) {
                $tiendasCierreCaja = $this->Maestro->lista_tiendas_caja();
                $this->set('nombreTienda', $tiendasCierreCaja);
                $this->set('data', $data);
                $this->set('idTienda', $this->Interfaz->id($this->Session->read('tienda_id_trabajo')));

                echo '1_|_';
            } else {
                echo '2_|_No existe un cierre de Caja para la caja en la fecha';
                $this->autoRender = false;
            }
        } else {
            echo '2_|_Debe indicar la fecha del cierre de caja';
            $this->autoRender = false;
        }
    }

    public function guardar() {
        extract($this->request->data);
        $this->request->data['tienda_id'] = $this->Interfaz->id($this->Session->read('tienda_id_trabajo'));
        $this->request->data['usuario_id'] = $this->Interfaz->id($this->Session->read('usuario_id'));
        $this->request->data['monto'] = 0;
        $this->request->data['observacion'] = $observacion_caja;

        if($this->request->data['cant'] > 1) {
            for ($i = 1; $i <= $this->request->data['cant']; $i++)
                $this->request->data['monto'] += $this->request->data["confirmar_$i"];
        }

        $tiendaSesion = $this->Session->read('tiendaBD');
        $objCieCaj = $this->Maestro->modelo('punto', 'CierreCaja', $tiendaSesion);
        $objFac = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);
        $objDev = $this->Maestro->modelo('punto', 'Devolucion', $tiendaSesion);
        $objPunto = $this->Maestro->modelo('punto', 'Punto', $tiendaSesion);
        $objNotaCredito = $this->Maestro->modelo('punto', 'NotaCredito', $tiendaSesion);
        $objNotaDebito = $this->Maestro->modelo('punto', 'NotaDebito', $tiendaSesion);
        
        if ($objCieCaj->save($this->request->data)) {
            if($this->Session->read('punto_id') != $this->request->data['punto_id']){
                $objPunto->updateAll(array('Punto.permiso_cierre' => 0), array('Punto.id' => $this->Session->read('punto_id')));
                //Si fecha de cierre es igual a actual hay que crear variable de session
            } else {
                if($this->request->data['fecha'] == date('d-m-Y')) {
                    $id = $this->Session->read('punto_id');
                    $pto = 'punto_' . $id . '_cerrado';
                    $this->Session->delete($pto);
                    $this->Session->write($pto,1);
                }
            }
            $objFac->updateAll(array('Facturacion.cierre_caja_id' => $objCieCaj->id), array('CAST(Facturacion.fecha AS DATE) =' => $this->request->data['fecha'], 'Facturacion.punto_id' => $this->request->data['punto_id']));
            $objDev->updateAll(array('Devolucion.cierre_caja_id' => $objCieCaj->id), array('CAST(Devolucion.fecha AS DATE) =' => $this->request->data['fecha'], 'Devolucion.punto_id' => $this->request->data['punto_id']));
            $objNotaCredito->updateAll(array('NotaCredito.cierre_caja_id' => $objCieCaj->id), array('CAST(NotaCredito.fecha AS DATE) =' => $this->request->data['fecha'], 'NotaCredito.punto_id' => $this->request->data['punto_id']));
            $objNotaDebito->updateAll(array('NotaDebito.cierre_caja_id' => $objCieCaj->id), array('CAST(NotaDebito.fecha AS DATE) =' => $this->request->data['fecha'], 'NotaDebito.punto_id' => $this->request->data['punto_id']));
            
            $cantidad = $objFac->find('count', array('conditions' => array('Facturacion.cierre_caja_id' => 0, 'CAST(Facturacion.fecha AS DATE) =' => $this->request->data['fecha'])));
            
            if($cantidad == 0) {
                $cantPuntos = $objPunto->find('count', array('conditions' => array('Punto.estatus' => 1)));
                $cantCierreCaja = $objCieCaj->find('count', array('conditions' => array('CierreCaja.tienda_id' => $this->request->data['tienda_id'], 'CierreCaja.fecha' => $this->request->data['fecha'])));
                $sql = "SELECT * FROM fnc_reporte_cierre_caja('tienda','{$this->request->data['fecha']}','{$this->request->data['fecha']}', 0, 0) AS (tipo text,fecha date,condicion text,documento text,rif text,nombre text,total double precision,referencia text,forma_pago text,contado double precision,credito double precision,retenido text, usuario text)";
                $data = $objFac->query($sql);
                //pr($data);die();
                $arregloTabla = array();
                foreach($data as $valor) {
                    $monto = 0;
                    if(!isset($arregloTabla[$valor[0]['condicion']]['total'])) {
                        switch ($valor[0]['condicion']) {
                            case 'DEVOLUCION':
                                $arregloTabla[$valor[0]['condicion']]['nombre'] = 'FACTURAS DEVUELTAS';
                            break;
                            case 'CANCELADA':
                                $arregloTabla[$valor[0]['condicion']]['nombre'] = 'FACTURAS CANCELADAS';
                            break;
                            case 'ANULADA':
                                $arregloTabla[$valor[0]['condicion']]['nombre'] = 'FACTURAS ANULADAS';
                            break;
                            case 'NOTASCREDITO':
                                $arregloTabla[$valor[0]['condicion']]['nombre'] = 'NOTAS DE CREDITO GENERADAS';
                            break;
                        }
                        $arregloTabla[$valor[0]['condicion']]['total'] = 0;
                        $arregloTabla[$valor[0]['condicion']]['cant'] = 0;
                    }
                    if(isset($formato) && $formato != $valor[0]['condicion'])
                        $arregloTabla[$formato]['total'] = $arregloTabla[$formato]['total'];
                    if(!isset($arregloTabla[$valor[0]['condicion']][$valor[0]['forma_pago']]['monto'])) {
                        $arregloTabla[$valor[0]['condicion']][$valor[0]['forma_pago']]['monto'] = $monto;
                        $arregloTabla[$valor[0]['condicion']][$valor[0]['forma_pago']]['cant'] = 0;
                    }
                    if(!empty($valor[0]['contado']))
                        $monto += $valor[0]['contado'];
                    if(!empty($valor[0]['credito']))
                        $monto += $valor[0]['credito'];
                    $arregloTabla[$valor[0]['condicion']][$valor[0]['forma_pago']]['monto'] += $monto;
                    $arregloTabla[$valor[0]['condicion']][$valor[0]['forma_pago']]['cant'] += 1;
                    $arregloTabla[$valor[0]['condicion']]['total'] += $monto;
                    $arregloTabla[$valor[0]['condicion']]['cant'] += 1;
                    $formato = $valor[0]['condicion'];
                }
                //pr($arregloTabla);
                $tabla = "<table border=1 align='center' style='width: 98%; border-spacing: 0; border-collapse: collapse;'>";
                $tabla .= "<tr><th width='50%'>Tipo</th><th width='15%'>Cantidad</th><th width='35%'>Total</th></tr>";
                foreach($arregloTabla as $indice => $valor) {
                    $tabla .= "<tr><td>{$valor['nombre']}</td><td align='right'>{$valor['cant']}</td><td align='right'>{$this->Interfaz->miles($valor['total'])}</td></tr>";
                }
                $tabla .= '</table>';

                if(isset($arregloTabla['CANCELADA']) && (count($arregloTabla['CANCELADA']) > 0)) {
                    $tabla .= "<br/><table border=1 align='center' style='width: 98%; border-spacing: 0; border-collapse: collapse;'>";
                    $tabla .= "<tr><th width='50%'>Forma de Pago</th><th width='15%'>Cantidad</th><th width='35%'>Total</th></tr>";
                    $total = 0;
                
                    foreach($arregloTabla['CANCELADA'] as $indice => $valor) {
                        if(is_array($valor)) {
                            $total += $valor['monto'];
                            $tabla .= "<tr><td>{$indice}</td><td align='right'>{$valor['cant']}</td><td align='right'>{$this->Interfaz->miles($valor['monto'])}</td></tr>";
                        }
                    }
                    $tabla .= "<tr><th align='right' colspan='2'>Total</th><th align='right'>{$this->Interfaz->miles($total)}</th></tr>";
                    $tabla .= '</table>';
                }
                
                $tabla .= "<br/>";
                //echo $tabla;die();

                $this->Correo;
                $variables = array("##TIENDA##" => "({$this->Session->read('codigo_punto')}) " . strtoupper($this->Session->read('nombre_punto')),
                    "##FECCIECAJ##" => $this->request->data['fecha'],
                    "##CANTCAJAS##" => "$cantCierreCaja/$cantPuntos",
                    "##CUERPO##" => $tabla,
                    "##IP##" => $_SERVER['REMOTE_ADDR'],
                    "##USUARIO##" => "{$this->Session->read('nombre_usuario')} ({$this->Session->read('username')})",
                    "##FECHA##" => date('d-m-Y'));

                foreach ($variables as $indice => $valor) {
                    $this->Correo->setVariable($indice, $valor);
                }

                $estado = $this->Correo->enviar($de = array('nombre' => $this->Session->read('EMAIL_FROM_NAME'), 'email' => $this->Session->read('EMAIL_FROM')), $this->Session->read('listaCorreos'), 'CIERRECAJA', null, null, array(array('imagen' => 'img' . DS . 'punto' . DS . 'email_header.jpg', 'etiqueta' => 'cabecera', 'tipo' => 'image/jpg')));
            }
            
            echo 1;
        } else
            echo 2;

        $this->autoRender = false;
    }

    public function actual() {
        $usuarioID = $this->Interfaz->id($this->Session->read('usuario_id'));
        $tiendaSesion = $this->Session->read('tiendaBD');
        $punto_id = $this->Session->read('punto_id');
        $fechaActual = date('Y-m-d');
        $objCotDet = $this->Maestro->modelo('punto', 'Facturacion', $tiendaSesion);

        $informacion = $objCotDet->query("select * FROM fnc_cierre_caja_punto('resumen', '$fechaActual', '$usuarioID', $punto_id) AS (tipo_id text,formapago text,
        monto text,montoret text,montoretisrl text)");

        $this->set('informacion', $informacion);
    }

}